Перейти к основному содержимому

1.08. Хранилище

Инженеру

Хранилище

Хранилище данных – устройство, где содержатся данные на постоянной основе, а другие устройства «забирают» отсюда данные для чтения, и записывают для хранения. Хранилище бывает нескольких видов:

  • HDD (жесткий диск) – медленный, но объемный, долговечный, но уязвим – боится ударов, из-за чего может легко повредиться;
  • SSD (твёрдотельный накопитель) – быстрый, менее ёмкий, нет движущихся частей, и главное – недолговечный, потому что число циклов записи-чтения ограничено;
  • NVMe – самый быстрый SSD, для игр и профессиональных задач.

Диск бывает физическим, логическим и виртуальным.

Физический диск - непосредственно устройство, которое хранит данные (SSD / HDD).

Логический диск - раздел диска. Физический диск разбивается на разделы с помощью таблицы разделов (например, MBR или GPT). Каждый раздел имеет свой идентификатор и назначение. Примеры разделов - системный раздел (служебный, для нужд операционной системы), основной раздел (для хранения файлов) и загрузочный раздел (который хранит в себе всё для запуска системы).

Таблица разделов - структура данных, записанная в начале физического диска, которая описывает, как он разбит на разделы. Она хранит информацию о размере каждого раздела, типе раздела, файловой системе и расположении разделов на диске. Существует несколько стандартов таблиц разделов, но наиболее распространёнными являются MBR (Master Boot Record) и GPT (GUID Partition Table).

MBR был введён IBM в 1983 году и стал стандартом для BIOS-систем. Размер - до 2 ТБ (из-за ограничения адресации в 32 бита). Количество разделов - максимум 4 основных, либо 3 основных и 1 расширенный, в который входят множество логических. Загрузочный сектор (первые 512 байт диска) содержат MBR-загрузчик (код загрузки ОС, 446 байт), таблицу разделов (64 байта), сигнатура (2 байта), маркер, указывающий, что это MBR.

GPT введён как часть стандарта UEFI (Unified Extensible Firmware Interface) в 2000-х годах. Поддерживает диски более 2 ТБ (теоретически, 9,4 ЗБ - зеттабайт). Количество разделов - до 128. Структура - заголовок GPT, основная таблица разделов, резервная копия таблицы и уникальные идентификаторы (GUID) - каждый раздел имеет уникальный идентификатор. GPT не поддерживается на старых BIOS-системах (только UEFI).

Виртуальный диск - область диска, упакованная в файл, которая резервируется в качестве диска для виртуальной машины. Но о виртуальных машинах мы поговорим позже.

Это, в принципе, база.


А теперь поехали погружаться.

Хранилище данных — фундаментальная составляющая любой информационной системы. Под этим термином понимается сложный иерархический комплекс, включающий в себя аппаратные компоненты, логические структуры, протоколы взаимодействия и программные абстракции, совместно обеспечивающие сохранность, целостность и доступность информации на длительных временных интервалах. Ключевой характеристикой хранилища является его способность обеспечивать постоянное (non-volatile) хранение, то есть сохранение данных вне зависимости от состояния питания. Это принципиально отличает его от оперативной памяти (RAM), которая является временной (volatile) и очищается при выключении питания.

Функционально хранилище служит в качестве буфера между процессами записи и чтения: одни компоненты системы — будь то приложения, драйверы, или операционная система — записывают данные в хранилище для долговременного сохранения, другие — извлекают их при необходимости. В этой роли хранилище выступает как среда постоянной памяти, в отличие от кэшей и регистров, предназначенных для временного удержания данных с целью ускорения обработки.

Однако само понятие «хранилище» неоднородно. Оно охватывает как физические устройства, так и логические конструкции, и даже абстракции, эмулирующие поведение дисков в программном окружении. Чтобы избежать путаницы, целесообразно выделить три ключевых уровня абстракции, на которых функционирует современное хранилище: физический, логический и виртуальный. Каждый из них определяет лежащие в основе принципы управления ресурсами, отказоустойчивости и производительности.

Физические носители

На нижнем уровне иерархии находятся физические устройства хранения — электромеханические или электронные компоненты, в которых непосредственно фиксируется информация посредством изменения физического состояния носителя (намагниченность домена, заряд ячейки флэш-памяти, фазовое состояние кристалла и т. д.). Современные серверные и клиентские системы преимущественно используют три типа таких устройств: жёсткие дисковые накопители (HDD), твердотельные накопители (SSD), и накопители, реализующие интерфейс NVMe. Несмотря на внешнее сходство в интерфейсах подключения (SATA, PCIe), их внутренняя архитектура, производительностные характеристики и надёжностные модели принципиально различны.

Жёсткий диск (HDD)

Жёсткий диск (Hard Disk Drive, HDD) остаётся наиболее распространённым типом хранилища по объёму установленной базы, особенно в сегментах, где критична удельная стоимость хранения (cost per gigabyte). Его конструкция основана на принципе магнитной записи на быстро вращающиеся металлические или стеклянные пластины (пластины, или platters), покрытые тонким слоем ферромагнитного материала. Информация записывается и считывается магнитными головками, расположенными на подвижных рычагах над поверхностью пластин. Головки не касаются поверхности, и парят на расстоянии порядка 10 нанометров за счёт воздушной подушки, образуемой вращением диска (эффект аэродинамической подъёмной силы).

Производительность HDD ограничена механическими факторами: латентностью вращения (время ожидания нужного сектора под головкой), seek time (временем позиционирования головки), и скоростью передачи данных по поверхности. В типичных потребительских моделях скорость вращения составляет 5400 или 7200 оборотов в минуту (RPM); в корпоративных — до 15 000 RPM. Это накладывает жёсткий предел на задержки доступа: даже в оптимистичном сценарии, среднее время доступа к случайному блоку данных составляет 8–12 мс, что на несколько порядков больше, чем у твердотельных накопителей.

Среди достоинств HDD — высокая удельная ёмкость (на 2025 год достигается 24–30 ТБ в одном 3,5"-форм-факторе) и низкая стоимость хранения, особенно при больших объёмах. Однако конструкция с подвижными частями делает устройство чувствительным к внешним воздействиям: удары, вибрации, резкие изменения температуры и влажности могут привести к головочному крашу (head crash) — ситуации, когда головка касается поверхности пластины и разрушает магнитный слой, что ведёт к необратимой потере данных. Кроме того, HDD подвержены износу со временем: износ подшипников шпинделя, деградация поверхности пластин, деградация головок. Тем не менее, в стационарных условиях эксплуатации, при отсутствии механических воздействий, срок службы HDD может превышать 5–7 лет; ресурс измеряется временем наработки на отказ (MTBF), обычно заявляемым производителями на уровне 600 000–2 000 000 часов.

Твердотельный накопитель (SSD)

Твердотельный накопитель (Solid-State Drive, SSD) кардинально отличается от HDD отсутствием механических компонентов. Данные в SSD хранятся в ячейках флэш-памяти на основе полупроводниковых транзисторов с плавающим затвором (floating-gate MOSFET). Основные типы флэш-памяти, используемые в SSD, — это SLC (Single-Level Cell), MLC (Multi-Level Cell), TLC (Triple-Level Cell) и QLC (Quad-Level Cell), где число уровней определяет количество бит, хранящихся в одной ячейке. Чем выше плотность записи, тем ниже стоимость и выше ёмкость, но тем ниже выносливость (endurance) и скорость записи.

Преимущество SSD — в отсутствии механической латентности: доступ к любому блоку осуществляется за микросекунды (обычно 50–150 мкс), что делает их на 1–2 порядка быстрее HDD в операциях случайного доступа. Кроме того, SSD устойчивы к вибрациям и ударам, потребляют меньше энергии, не издают шума, и имеют меньшие габариты, что особенно важно для мобильных устройств.

Главное ограничение SSD — конечный ресурс ячеек флэш-памяти. Каждая запись в ячейку сопровождается прохождением тока через туннельный оксидный слой, что постепенно его деградирует. После определённого числа циклов программирования/стирания (P/E cycles) ячейка теряет способность удерживать заряд. Ресурс зависит от типа ячеек: у SLC — до 100 000 циклов, у MLC — 3 000–10 000, у TLC — 500–3 000, у QLC — 100–1 000. Однако на практике этот лимит компенсируется механизмами wear leveling (равномерного распределения записи по ячейкам), over-provisioning (резервирования избыточной ёмкости), и write amplification reduction. В результате современные потребительские SSD обладают заявленным ресурсом в сотни терабайт записанных данных (TBW, Terabytes Written), например — 600 TBW для 1 ТБ накопителя, что при среднем пользовательском сценарии соответствует десятилетиям эксплуатации.

Таким образом, тезис о «недолговечности» SSD требует уточнения: устройство недолговечно в циклическом смысле. При умеренной интенсивности записи SSD может служить дольше HDD. Однако в сценариях интенсивной записи (например, в базах данных без кэширования, видеонаблюдении, логгировании) износ становится критическим фактором, и здесь применяются специализированные модели с повышенной выносливостью (enterprise-grade SSD), часто на основе SLC/MLC и с поддержкой eMLC (enterprise MLC).

NVMe

NVMe (Non-Volatile Memory Express) — протокол доступа, разработанный специально для флэш-памяти, подключаемой через шину PCI Express. В отличие от унаследованного протокола ATA (используемого в SATA SSD и HDD), NVMe разрабатывался с нуля с учётом параллелизма, низкой латентности и глубокой очереди команд — свойств, присущих флэш-памяти.

SATA, даже в третьей версии (SATA III), ограничен пропускной способностью ~600 МБ/с и глубиной очереди команд в 32. NVMe, напротив, поддерживает тысячи очередей по 64 000 команд каждая, обеспечивает латентность на уровне 10–20 мкс и достигает скоростей свыше 7 000 МБ/с (в PCIe 4.0 x4) и 14 000 МБ/с (в PCIe 5.0 x4). Архитектура NVMe позволяет обходить традиционные узкие места, такие как AHCI-стек (Advanced Host Controller Interface), и взаимодействовать напрямую с контроллером памяти через драйверы на уровне ядра.

Фактически, NVMe-накопители — это SSD, реализованные в форм-факторе M.2 или U.2 и использующие PCIe в качестве транспорта. Они маркируют переход от дисковой модели (где устройство ведёт себя как «медленный барабан») к памяти-подобной модели (где устройство интегрируется в адресное пространство памяти). Именно поэтому NVMe особенно эффективен в высокопроизводительных сценариях: загрузка больших проектов в IDE, рендеринг видео, операции с базами данных, машинное обучение, и, конечно, игры — где критичны задержки при произвольном доступе к мелким блокам.

Важно подчеркнуть: NVMe является интерфейсным и логическим улучшением SSD, раскрывающим его скрытый потенциал. Многие современные SSD доступны как в SATA, так и в NVMe-версиях, при одинаковой внутренней архитектуре памяти, но с разной производительностью на выходе.


Логическое хранилище

Физический носитель, будь то HDD или SSD, изначально представляет собой линейную последовательность адресуемых блоков — секторов (традиционно по 512 байт, в современных устройствах — 4096 байт, так называемые Advanced Format). Сам по себе такой «сырой» массив байтов не содержит никакой информации о том, как данные организованы, где начинается одна запись и заканчивается другая, какие участки заняты, а какие свободны. Чтобы операционная система могла использовать диск как средство хранения файлов, каталогов, метаданных и загрузочных компонентов, требуется ввести логическую структуру — иерархию абстракций, накладываемую поверх физического устройства.

Центральным элементом этой структуры является логический диск — программная единица хранения, выделяемая операционной системой и воспринимаемая ею как самостоятельное блочное устройство (block device), несмотря на то, что физически он может занимать лишь часть физического носителя. Логические диски возникают в результате разметки (partitioning) физического диска — процесса, при котором его адресное пространство делится на непересекающиеся области, каждая из которых может быть независимо отформатирована, смонтирована и использована.

Разметка регулируется таблицей разделов — служебной структурой данных, записанной в заголовочную область физического диска и описывающей геометрию и назначение логических дисков, на которые он разбит. Таблица разделов — это своего рода карта территории: она указывает, с какого LBA-адреса (Logical Block Address) начинается каждый раздел, его размер в секторах, тип содержимого (например, «загрузочный», «Linux-файловая система», «своп») и статус (активен/неактивен). Без этой карты операционная система не способна обнаружить логические диски, даже если они физически присутствуют на носителе.

Существует два доминирующих стандарта таблиц разделов: MBR (Master Boot Record) и GPT (GUID Partition Table). Они различаются философией проектирования — MBR отражает эпоху BIOS и 16-битных вычислений, тогда как GPT — эпоху UEFI и 64-битных адресных пространств.

MBR

Master Boot Record был введён IBM в 1983 году как часть архитектуры IBM PC DOS и с тех пор стал де-факто стандартом для персональных компьютеров на протяжении почти трёх десятилетий. MBR располагается в первых 512 байтах физического диска (сектор 0), и его структура жёстко регламентирована:

  • Байты 0–445: исполняемый код загрузчика (bootloader code), 446 байт. Это машинный код, который BIOS загружает в память и передаёт ему управление при старте системы. Его задача — найти активный (bootable) раздел, загрузить его начальный сектор (VBR — Volume Boot Record) и передать ему управление.
  • Байты 446–509: таблица разделов, 64 байта. Состоит из четырёх записей по 16 байт каждая. Каждая запись содержит: статус раздела (активен/неактивен), CHS-адрес начала (устаревший цилиндр-головка-сектор), LBA-адрес начала, тип раздела (например, 0x07 — NTFS, 0x83 — Linux), и размер в секторах.
  • Байты 510–511: сигнатура 0x55AA, подтверждающая валидность MBR.

Основное ограничение MBR связано с использованием 32-битного поля для указания размера раздела в секторах. При размере сектора 512 байт максимальный адресуемый объём составляет 2³² × 512 = 2 199 023 255 552 байт ≈ 2,2 ТБ. Даже при переходе на 4К-сектора лимит возрастает лишь до ~17,6 ТБ, но большинство BIOS и ОС не поддерживают такой режим корректно — фактический предел остаётся на уровне 2 ТБ.

Кроме того, MBR допускает лишь четыре первичных раздела. Для обхода этого ограничения был введён механизм расширенного раздела: один из четырёх записей может быть помечен как «расширенный» (тип 0x05 или 0x0F), и внутри него может размещаться цепочка логических разделов, описываемых собственными таблицами в их заголовочных секторах (Extended Boot Records, EBR). Такая вложенная структура хрупка: повреждение одного EBR делает недоступными все последующие логические разделы.

Наконец, MBR не содержит механизмов проверки целостности: отсутствует контрольная сумма, дублирование метаданных или резервные копии. Повреждение первых 512 байт (например, при некорректной записи загрузчика) приводит к полной потере информации о структуре диска — восстановление требует ручного анализа сигнатур файловых систем или использования специализированных утилит вроде testdisk.

GPT

GUID Partition Table была разработана в рамках инициативы Intel по созданию Unified Extensible Firmware Interface (UEFI) и стандартизирована в спецификации EFI. Её ключевая цель — устранить архитектурные узкие места MBR и обеспечить поддержку современных объёмов хранения и требований к надёжности.

GPT использует 64-битную адресацию LBA, что теоретически позволяет работать с дисками объёмом до 2⁶⁴ × 512 байт ≈ 9,4 зеттабайт — объём, превышающий совокупную ёмкость всех жёстких дисков, произведённых человечеством на 2025 год. Практически же ограничения накладываются файловыми системами (например, NTFS поддерживает тома до 256 ТБ, ZFS — экспоненциально больше) и самими ОС (Windows Server 2022 поддерживает тома до 64 зеттабайт в ReFS, но интерфейсы управления пока не готовы к таким масштабам).

Структура GPT включает следующие компоненты:

  1. Protective MBR (сектор 0): эмуляция MBR, содержащая один «фейковый» раздел типа 0xEE (EFI GPT Protective), занимающий весь диск. Это необходимо для совместимости: старые утилиты, не понимающие GPT, увидят один большой раздел и не попытаются перезаписать GPT-метаданные, приняв диск за неразмеченный.
  2. GPT Header (сектор 1): 92-байтовая структура с ключевой информацией: сигнатура «EFI PART», ревизия, размер заголовка, CRC32 контрольная сумма самого заголовка, LBA текущего и резервного заголовков, LBA начала и конца таблицы разделов, количество записей, размер записи, CRC32 таблицы разделов.
  3. Primary Partition Table (обычно секторы 2–33): массив записей о разделах. Каждая запись — 128 байт (в отличие от 16 у MBR), содержит: GUID типа раздела (например, C12A7328-F81F-11D2-BA4B-00A0C93EC93B — EFI System Partition), уникальный GUID раздела (гарантирует глобальную уникальность даже при клонировании), начальный и конечный LBA, атрибуты (только для чтения, скрытый и т. д.), и 72-байтовое имя в UTF-16.
  4. Разделы данных — собственно, логические диски.
  5. Backup Partition Table — дубликат таблицы разделов в конце диска.
  6. Backup GPT Header — резервная копия заголовка, также в конце диска.

GPT поддерживает до 128 разделов по умолчанию (число может быть увеличено, но требует изменения размера записи), и каждому присваивается глобально уникальный идентификатор (GUID). Это позволяет избежать конфликтов при монтировании нескольких дисков и упрощает автоматическое распознавание разделов (например, EFI System Partition ищется по его известному GUID, а не по номеру или букве).

Критически важным является механизм самопроверки и восстановления: CRC32 контрольные суммы обоих заголовков и таблиц разделов позволяют обнаружить повреждение метаданных. При несоответствии основной таблицы её резервной копии — GPT-совместимый загрузчик (например, UEFI firmware или gdisk) может автоматически восстановить структуру.

Ограничение совместимости: GPT-диски могут загружаться только в режиме UEFI. Старые BIOS не поддерживают загрузку с GPT напрямую (за исключением гибридных схем типа Apple’s GUID+MBR или Microsoft’s Windows-to-Go с особым VBR), поскольку BIOS ожидает найти исполняемый код в первых 446 байтах MBR — а в GPT там находится лишь защитный заглушка. Таким образом, переход на GPT неизбежно связан с миграцией на UEFI, что, в свою очередь, требует поддержки со стороны материнской платы, ОС и драйверов.

Логические диски и их функциональное назначение

После разметки каждый логический диск (раздел) может быть независимо отформатирован файловой системой (FAT32, NTFS, ext4, APFS и др.) и назначен для конкретной роли. На практике выделяют три ключевых типа разделов, особенно в контексте загрузочных систем:

  • Загрузочный (boot) раздел — содержит компоненты, необходимые для инициализации ядра ОС: загрузчик второго уровня (GRUB, systemd-boot, BOOTMGR), конфигурационные файлы, иногда — ядро и initramfs (в Linux). В системах UEFI этот раздел обязан быть отформатирован в FAT32 и иметь тип EFI System Partition (ESP), поскольку UEFI firmware умеет читать только FAT-разделы на этапе предзагрузки.

  • Системный (system) раздел — содержит корневую файловую систему, включая бинарные файлы ОС, системные библиотеки, конфигурации, и пользовательские данные (в Unix-подобных системах — всё дерево от /). В Windows системный раздел — тот, на который установлен Windows (обычно C:\), и он может совпадать с загрузочным или быть отдельным (в enterprise-развёртываниях часто разделяют для безопасности и упрощения обновлений).

  • Служебные разделы — к ним относятся: раздел подкачки (swap, pagefile.sys), раздел восстановления (Windows Recovery Environment), раздел Microsoft Reserved (MSR, 128 МБ, зарезервирован для динамических дисков и BitLocker), разделы BitLocker, разделы LUKS для шифрования, и т. д. Эти разделы обычно скрыты от пользователя и управляются на уровне ОС или прошивки.

Важно: термины загрузочный и системный часто путают. В BIOS-системах с MBR загрузочный и системный разделы часто совпадают (активный первичный раздел содержит и загрузчик, и ОС). В UEFI-системах с GPT они почти всегда разделены: ESP (загрузочный) — небольшой FAT32-раздел (~100–550 МБ), а системный — отдельный NTFS/ext4/Btrfs-раздел, куда монтируется корень ОС.


Виртуальное хранилище

Виртуальный диск — это файл или набор файлов, которые операционная система или гипервизор интерпретируют как блочное устройство. С точки зрения гостевой операционной системы (виртуальной машины), виртуальный диск выглядит и ведёт себя точно так же, как физический HDD или SSD: он имеет размер, поддерживает операции чтения/записи по LBA-адресам, может быть размечен таблицей разделов, отформатирован файловой системой и использован для загрузки. Однако на уровне хоста он представляет собой обычный файл (или группу файлов) в файловой системе хоста — например, vm01.vhdx в NTFS или disk.qcow2 в ext4.

Ключевая идея виртуального диска — декомпозиция зависимостей между уровнем хранения и уровнем вычислений. Благодаря этому становится возможным:

  • динамическое выделение места (thin provisioning);
  • мгновенное клонирование и снапшотирование;
  • миграция виртуальных машин между физическими хостами без переноса «железа»;
  • шифрование и сжатие на уровне образа;
  • интеграция с системами хранения на основе объектов (например, Ceph RBD, AWS EBS).

Важно различать виртуальный диск как концепцию и формат образа — конкретную реализацию его метаданных и данных. От формата зависят поддерживаемые функции, эффективность работы с «дырявыми» файлами (sparse files), надёжность при сбоях питания и т. д.

Основные форматы виртуальных дисков

VHD / VHDX (Microsoft)

VHD (Virtual Hard Disk) — формат, изначально разработанный компанией Connectix в 1990-х, позднее приобретённый Microsoft и интегрированный в Hyper-V и Windows Virtual PC. Изначально ограничивался 2 ТБ (из-за 32-битных смещений и 512-байтных секторов), что стало критическим в эпоху больших баз данных и виртуализированных рабочих станций.

В 2012 году Microsoft представила VHDX — масштабируемую замену VHD. Ключевые улучшения:

  • поддержка дисков до 64 ТБ (64-битные LBA и секторы до 4 КБ);
  • защита от повреждения при сбоях питания за счёт журналирования метаданных (metadata log);
  • оптимизация для больших блоков (1 МБ) и выравнивание по границам 1 МБ — критично для SSD и RAID;
  • встроенное сжатие (LZ77) и шифрование (BitLocker at-rest);
  • поддержка «дифференцирующих» дисков (differencing disks) с цепочками снапшотов до 255 уровней.

VHDX использует гибкую структуру регионов (regions): заголовок, таблицы BAT (Block Allocation Table), метаданные (например, FileParameters, ParentLocator), и регион данных. BAT-таблица отображает виртуальные LBA-блоки (в терминах гостевой ОС) на физические смещения внутри файла или в родительском диске — именно это позволяет реализовать тонкое выделение места (thin provisioning): физическое пространство резервируется только при первой записи в блок.

QCOW2 (QEMU)

QCOW2 (QEMU Copy-On-Write v2) — формат по умолчанию для гипервизора QEMU/KVM и многих open-source решений (Proxmox, oVirt, OpenStack). Был разработан как эволюция QCOW с упором на надёжность и расширяемость.

QCOW2 поддерживает:

  • диски до 2⁶⁴ байт (теоретически — 16 эксабайт);
  • снапшоты (встроенные и внешние), включая именованные и с описаниями;
  • сжатие на уровне блоков (zlib, zstd);
  • шифрование AES (устаревшее, но совместимое) и LUKS (современное);
  • cluster size от 512 байт до 2 МБ — параметр, влияющий на компактность и производительность;
  • refcount table — механизм подсчёта ссылок на блоки, позволяющий реализовывать copy-on-write без дублирования данных.

Архитектура QCOW2 строится на иерархии индексов: L1-таблица → L2-таблицы → кластеры данных. Эта структура напоминает многоуровневые страницные таблицы в MMU и обеспечивает эффективный sparse allocation. При сбое питания QCOW2 использует journal для восстановления согласованности метаданных, хотя гарантии строгости слабее, чем у VHDX.

VMDK (VMware)

VMDK (Virtual Machine Disk) — проприетарный, но документированный формат VMware. Имеет две основные разновидности:

  • monolithic — один большой файл (.vmdk + .-flat.vmdk);
  • split — разделён на фрагменты по 2 ГБ (для совместимости с FAT32);
  • stream-optimized — упакован для передачи по сети (используется в OVF/OVA);
  • SESparse — тонкий формат с поддержкой TRIM/UNMAP и ускоренной дефрагментацией.

Современные версии VMDK (v4 и выше) поддерживают диски до 62 ТБ, секторы 4 КБ, снапшоты, и совместимы с vSphere Storage APIs. VMware активно внедряет интеграцию с vSAN и Space Reclamation — функцией, позволяющей гостевой ОС (через SCSI UNMAP) освобождать неиспользуемые блоки в хостовой файловой системе.

Типы выделения места: fixed, dynamic, differencing

Независимо от формата, виртуальные диски классифицируются по стратегии распределения физического пространства на хосте:

  • Fixed (thick provisioned, eager-zeroed) — файл создаётся сразу требуемого размера (например, 100 ГБ), и все блоки предварительно заполняются нулями. Преимущества: максимальная производительность записи (отсутствует накладная на выделение), предсказуемое поведение, совместимость со старыми системами. Недостатки: высокое потребление места, долгое время создания, невозможность переполнения хоста при создании, но — при записи.

  • Dynamic (thin provisioned) — файл изначально мал (несколько МБ), и физические блоки выделяются по мере первой записи в соответствующую область. Это позволяет эффективно использовать место в пуле хранения: 10 ВМ с «дисками по 1 ТБ» могут занимать суммарно 2 ТБ, если реально используется мало данных. Однако thin provisioning вносит риски: если все ВМ одновременно начнут активно писать, пул хранения может исчерпаться — последствия варьируются от остановки записи до BSOD в гостевой ОС. Для предотвращения используются квоты, резервирование, и мониторинг.

  • Differencing (copy-on-write) — специальный тип dynamic-диска, имеющий родителя. Все чтения направляются в родительский диск, а запись в блок приводит к копированию этого блока в дочерний файл, после чего изменение применяется уже к копии. Это позволяет создавать цепочки снапшотов или шаблонных ВМ («golden image»), где десятки машин разделяют общий базовый образ и хранят только свои изменения. Однако цепочки глубиной >10–20 уровней ведут к деградации производительности из-за множественных перенаправлений.

Виртуальные диски и уровень абстракций ОС

Важно понимать, что виртуальный диск — лишь один из уровней в стеке хранения. Операционная система накладывает дополнительные абстракции поверх блочных устройств, будь то физические, логические или виртуальные.

  • Том (volume) — логическое устройство, составленное из одного или нескольких разделов/дисков. В Windows термин «том» часто синонимичен «логическому диску» (например, C:), но технически он может объединять несколько физических дисков через Dynamic Disks (software RAID). В Linux том — результат работы LVM или MD RAID.

  • LVM (Logical Volume Manager) — механизм, позволяющий объединять физические диски (PV, Physical Volumes) в группу томов (VG, Volume Group), из которой выделяются логические тома (LV, Logical Volumes) произвольного размера. LVM поддерживает динамическое изменение размера, снапшоты (через copy-on-write), и зеркалирование. Ключевой элемент — метаданные LVM, хранящиеся в заголовке каждого PV и дублируемые в VG.

  • ZFS (Zettabyte File System)объединённая система хранения, где управление дисками, томами, кэшированием, снапшотами и целостностью данных происходит на одном уровне. ZFS объединяет диски в пулы (zpools), из которых создаются датасеты (datasets) — аналоги логических томов. Каждая операция записи проходит через copy-on-write транзакцию: данные записываются в новое место, а указатели обновляются атомарно. Это исключает состояние «частично записанного» блока при сбое. Для защиты от bit rot используется сквозное контрольное суммирование (block checksumming) и самоисцеление (self-healing) при наличии избыточности (mirror, RAID-Z).

  • Btrfs — аналог ZFS в Linux-экосистеме, хотя и менее зрелый в части отказоустойчивости. Поддерживает пулы устройств, подтома, снапшоты, сжатие (zstd), и checksumming. Однако из-за сложности и отсутствия enterprise-поддержки (на 2025 год) редко используется в критичных нагрузках.

Эти абстракции часто комбинируются: например, виртуальный диск VHDX → гостевая ОС с LVM → поверх LVM — XFS. При этом каждый уровень может вносить свою накладную: выравнивание секторов на границы 4 КБ → выравнивание LVM extent (обычно 4 МБ) → выравнивание блоков XFS (обычно 1 МБ). Несоблюдение выравнивания приводит к read-modify-write циклам и деградации производительности, особенно на SSD.


Современные парадигмы хранения

1. Вычислительные накопители (Computational Storage)

Вычислительный накопитель (Computational Storage Drive, CSD) — это принципиально новый класс устройств, в котором вычисления перемещаются ближе к данным. Идея основана на простом наблюдении: в традиционной архитектуре фон Неймана данные постоянно перемещаются между памятью и процессором через шину, что создаёт «узкое горлышко» (von Neumann bottleneck). При работе с большими объёмами данных (аналитика, машинное обучение, обработка логов) до 90 % энергии и времени тратится на перемещение, а не на обработку.

CSD интегрирует в контроллер накопителя (или в отдельный чип на плате) вычислительное ядро — обычно ARM Cortex-A или RISC-V — с доступом к флэш-памяти напрямую, минуя хостовую память. Это позволяет выполнять операции in-situ:

  • фильтрация записей по предикату («выдать только строки, где status = 'active'»);
  • агрегация (сумма, среднее, хеш-агрегаты);
  • шифрование/дешифрование на уровне блока (без загрузки данных в RAM);
  • предварительная обработка ML-моделей (inference на сырых данных);
  • сжатие/дедупликация «на лету».

Стандартизацией CSD занимается группа SNIA (Storage Networking Industry Association), предложившая два уровня:

  • CSD (Computational Storage Device) — базовый: вычисления инициируются хостом через специальные команды NVMe (например, Admin Command 0xC0 для запуска программы);
  • CSP (Computational Storage Processor) — расширенный: устройство может инициировать обработку автономно, по расписанию или триггеру.

Примеры реализации:

  • Samsung SmartSSD (на базе Xilinx FPGA),
  • Western Digital Ultrastar DC ZN540 (с интегрированным CPU и 2 ГБ DRAM),
  • ScaleFlux CSD 2000 (аппаратное сжатие в реальном времени, снижающее write amplification и увеличивающее эффективную ёмкость на 2–3×).

Ключевое преимущество — снижение latency и bandwidth consumption на шине PCIe. В одном эксперименте (2023, Microsoft Research) фильтрация 1 ТБ данных на CSD заняла 48 секунд при потреблении 12 Вт, тогда как на CPU — 192 секунды и 140 Вт. Однако сложность разработки ПО (необходимость писать код под архитектуру CSD), фрагментация экосистемы и отсутствие высокого уровня абстракции (пока нет стандартного runtime, как для CUDA) сдерживают массовое внедрение.

2. Зонированное хранение (Zoned Storage)

Зонированное хранение — ответ на физические ограничения роста плотности записи в NAND и магнитных носителях. При увеличении числа бит на ячейку (TLC, QLC) и уменьшении размера ячейки растёт интерференция между соседними ячейками, что требует более сложных схем записи. В HDD переход к технологии SMR (Shingled Magnetic Recording) позволил увеличить плотность на 25–50 %, но ценой радикального изменения модели доступа: дорожки записываются с перекрытием (как черепица — shingles), и запись в одну дорожку разрушает соседнюю. Следовательно, SMR-диски эффективны только при последовательной записи — случайная запись приводит к катастрофическому падению производительности.

Аналогичная проблема возникла в SSD: при переходе к 3D NAND с 128+ слоями и QLC-ячейками контроллеры вынуждены использовать всё более агрессивные схемы управления износом, что увеличивает write amplification. В ответ JEDEC и NVM Express разработали ZNS (Zoned Namespace) — спецификацию для NVMe, вводящую понятие зоны — непрерывного диапазона LBA-адресов, в который можно писать только последовательно, начиная с головы зоны. Запись в середину зоны запрещена; для изменения данных требуется запись в новую позицию (append) и обновление указателя.

ZNS-SSD (например, Kioxia CM7-Z, Solidigm P5336-Z) устраняют необходимость в FTL (Flash Translation Layer) на стороне контроллера: отображение LBA → физический адрес происходит в драйвере ОС или в приложении. Это снижает latency (на 100–200 мкс), уменьшает объём DRAM на диске (до 70 %), и повышает предсказуемость производительности.

Поддержка в ОС:

  • Linux ядро 5.6+ — драйвер zbd, утилиты blkzone, fio --zoned;
  • файловые системы: F2FS (в режиме zoned), ZenFS (RocksDB + ZNS), Zoned Btrfs (в разработке);
  • базы данных: RocksDB, ScyllaDB адаптированы под ZNS.

Экономический эффект: ZNS-SSD дешевле на 20–30 % при той же ёмкости, так как требуют меньше DRAM и упрощённого контроллера. Однако программная экосистема пока нишевая — требуется переписывание I/O-стека «снизу вверх».

3. Энергонезависимая память (Persistent Memory, PMem)

Persistent Memory — класс устройств, сочетающих характеристики DRAM (байт-адресуемость, низкая latency — 100–300 нс) и NAND (энергонезависимость). Первое поколение — Intel Optane Persistent Memory (на базе 3D XPoint) — вышло в 2019 году. Технология XPoint использует изменение сопротивления материала (phase-change или resistive switching), а не заряд/намагниченность, что обеспечивает высокую выносливость (~30 DWPD — drive writes per day) и симметричные скорости записи/чтения.

PMem работает в двух режимах:

  • Memory Mode — как кэш DRAM (до 4 ТБ на сокет), управляемый контроллером памяти;
  • App Direct Mode — как отдельное адресное пространство, доступное через mmap() и специальные инструкции (clwb, sfence), требующие persistence-aware programming.

Ключевая сложность — обеспечение согласованности при сбое. В DRAM запись в ячейку атомарна на уровне кэш-линии (64 байта), но в PMem требуется явно подтверждать сохранность (clwb для сброса кэша в контроллер, sfence для упорядочения). Библиотеки вроде PMDK (Persistent Memory Development Kit) предоставляют транзакционные аллокаторы (pmemobj), устойчивые к частичным сбоям.

Примеры использования:

  • Redis на PMem — снижение latency на 40 %, увеличение ёмкости в 8×;
  • SAP HANA — хранение «холодных» таблиц напрямую в PMem, минуя DRAM;
  • Kafka — устойчивый лог с нулевой копией данных.

В 2022 году Intel прекратила производство Optane, но технология развивается дальше через стандарт CXL (Compute Express Link) — шину следующего поколения, объединяющую CPU, память и ускорители. CXL.mem позволяет подключать память (включая PMem) как расширение основного пула, с когерентностью кэша и виртуализацией. Уже анонсированы CXL-устройства от Samsung, SK Hynix и Micron — ожидается, что к 2026 году PMem станет стандартной опцией в серверах для гибридных рабочих нагрузок.

4. От блоков и файлов — к объектам и метаданным

Последняя тенденция — исчезновение диска как концепции на уровне приложения. В облачных средах разработчик больше не работает с /dev/sda или C:\, а взаимодействует с объектным хранилищем через HTTP API:

  • Amazon S3PUT /bucket/key, GET /bucket/key?versionId=…;
  • Azure Blob StoragePUT https://account.blob.core.windows.net/container/blob;
  • Google Cloud Storage — аналогично.

Объект — это неструктурированный байтовый массив с уникальным ключом (например, user-avatars/12345.jpg) и метаданными в виде пар «ключ-значение» (Content-Type: image/jpeg, x-amz-meta-owner: timur). Преимущества:

  • горизонтальная масштабируемость (S3 хранит эксабайты);
  • встроенная репликация и отказоустойчивость (обычно 3+ копии в разных зонах);
  • гибкая модель доступа (IAM, presigned URLs);
  • интеграция с аналитикой (S3 Select, Athena), ML (SageMaker), и архивированием (Glacier).

Однако объектное хранилище не заменяет блочное: оно плохо подходит для транзакционных БД (из-за высокой latency на мелкие записи) и требует рефакторинга приложений. Для преодоления этого появляются гибридные абстракции:

  • S3FS / goofys — монтирование бакета как файловой системы (но с кэшированием и буферизацией);
  • Rook / Ceph CSI — предоставление блочных устройств поверх объектного пула (Ceph RBD → Ceph OSD → BlueStore → RocksDB);
  • Lakehouse architecture (Delta Lake, Iceberg) — хранение табличных данных в объектах с транзакционными гарантиями через метаданные (transaction log).

Здесь формируется новая иерархия:

Объекты (S3)

Файлы (POSIX, NFS)

Блоки (NVMe, iSCSI)

Физические носители (QLC SSD, SMR HDD)

Каждый уровень решает свою задачу: объекты — для масштаба и доступа через сеть, файлы — для совместимости с legacy-ПО, блоки — для низкоуровневой производительности, физические носители — для экономики хранения.